package cliente;

import java.net.SocketException;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
import excepciones.*;
import utilidad.Ping;
import utilidad.SocketManager;


public class GestorInicioSesion {
	
	private String nombre;
	private String pass;
	private String ip;
	private SocketManager sm;
	private VentanaCliente vCliente;
	
	public GestorInicioSesion(String nombre, String pass, String ip,
			VentanaCliente vCliente) {
		super();

		this.vCliente = vCliente;
		this.nombre = nombre;
		this.pass = pass;
		
		if (ip.equals(""))
			this.ip = "127.0.0.1";
		else
			this.ip = ip;
			
	}
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public SocketManager getSm() {
		return sm;
	}
	public void setSm(SocketManager sm) {
		this.sm = sm;
	}
	public VentanaCliente getvCliente() {
		return vCliente;
	}
	public void setvCliente(VentanaCliente vCliente) {
		this.vCliente = vCliente;
	}
	
	public void inicioConexion(){
		String sentenciaAEnviar = "";
		String sentenciaRecibida = "";
		try {
			System.out.println("EN GESTOR: ");
			System.out.println("Nombre:" + this.getNombre() + " Pass:"
					+ this.getPass() + " IP:" + this.getIp());
			
			//Hacemos ping para ver si la IP es correcta y hay servidor
			
			Ping p= new Ping();
			if(!p.realizarPing(this.getIp()))
			{
				
				throw new IPIncorrectaException();
				
			}
			else
			{
			
			sm = new SocketManager(this.getIp(), 3001);
			

			sentenciaAEnviar = "USER " + this.getNombre();
			System.out.println("Sentencia enviada:" + sentenciaAEnviar);
			try{
			sm.Escribir(sentenciaAEnviar + '\n');
			}catch(SocketException e)
			{
				JOptionPane.showMessageDialog(null, "Parece que la conexión no ha podido realizarse. \nEs posible que se haya superado el número máximo de conexiones. Intentelo más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
			}
			sentenciaRecibida = sm.Leer();
			System.out.println(sentenciaRecibida);
			StringTokenizer token=null;
			try{
			token = new StringTokenizer(sentenciaRecibida);
			}
			catch(NullPointerException npe)
			{
				JOptionPane.showMessageDialog(null, "Parece que la conexión no ha podido realizarse. \nEs posible que se haya superado el número máximo de conexiones. Intentelo más tarde.", "¡Ups!", JOptionPane.ERROR_MESSAGE);
				System.exit(0);
			}
			String codigoError = token.nextToken();
			System.out.println(codigoError);
			
			if (codigoError.equals("200")) {
				sentenciaAEnviar = "PASS " + this.getPass();
				System.out.println("Sentencia enviada:" + sentenciaAEnviar);
				sm.Escribir(sentenciaAEnviar + '\n');
				sentenciaRecibida = sm.Leer();
				System.out.println(sentenciaRecibida);
				token = new StringTokenizer(sentenciaRecibida);
				codigoError = token.nextToken();
				
				if (codigoError.equals("201")) {
					vCliente.dispose();
					VentanaPrincipal vp = new VentanaPrincipal(sm);
					
					

				} else if(codigoError.equals("401")){
					
					vCliente.vaciarContrasenaField();
					throw new ClaveIncorrectaException();
					
				} else if(codigoError.equals("402")){
					
					vCliente.vaciarContrasenaField();
					throw new FaltaClaveException();
				}
			}

			else if (codigoError.equals("401")) {
				
				vCliente.vaciarUsuario();
				vCliente.vaciarContrasenaField();
				throw new UsuarioDesconocidoException();
				

			}
			else if (codigoError.equals("400")) {
				vCliente.vaciarUsuario();
				vCliente.vaciarContrasenaField();
				throw new FaltaNombreException();
			}
		}

		} catch (Exception e) {
			System.err.println("main: " + e);
			e.printStackTrace();
		}
	}
	

}
